package cn.iocoder.yudao.module.ai.graph.node.customerservice;

import com.alibaba.cloud.ai.graph.GraphResponse;
import com.alibaba.cloud.ai.graph.OverAllState;
import com.alibaba.cloud.ai.graph.action.NodeAction;
import com.alibaba.cloud.ai.graph.streaming.FluxConverter;
import com.alibaba.cloud.ai.graph.streaming.StreamingOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import reactor.core.publisher.Flux;

import java.util.Map;

/**
 * 生成回复节点 - 基于问题分类生成专业的客服回复
 * 
 * @author yudao
 * @since 2025/10/17
 */
public class GenerateReplyNode implements NodeAction {

    private static final Logger logger = LoggerFactory.getLogger(GenerateReplyNode.class);

    private static final String REPLY_PROMPT_TEMPLATE = """
        你是一个专业、友好的客服助手。请根据客户问题和分类信息，生成一个专业的回复。
        
        客户问题：%s
        问题类别：%s
        优先级：%s
        客户情绪：%s
        
        回复要求：
        1. 语气要专业、友好、有同理心
        2. 如果客户情绪是 negative，要特别注意安抚
        3. 如果是 high 优先级，要强调我们对问题的重视
        4. 提供清晰、可执行的解决方案
        5. 如果无法立即解决，说明后续处理流程
        6. 回复长度控制在 200 字以内
        
        请生成回复：
        """;

    private final ChatClient chatClient;

    public GenerateReplyNode(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    @Override
    public Map<String, Object> apply(OverAllState state) {
        logger.info("=== GenerateReplyNode 开始执行 ===");
        
        String query = state.value("customer_query", "");
        String category = state.value("query_category", "技术支持");
        String priority = state.value("query_priority", "medium");
        String sentiment = state.value("query_sentiment", "neutral");
        
        logger.info("为客户生成回复 - 类别：{}，优先级：{}，情绪：{}", category, priority, sentiment);

        // 格式化提示词
        String prompt = String.format(REPLY_PROMPT_TEMPLATE, query, category, priority, sentiment);
        
        // 调用 AI 生成回复
        Flux<ChatResponse> chatResponseFlux = this.chatClient.prompt()
                .user(prompt)
                .stream()
                .chatResponse();

        // 转换为流式输出
        Flux<GraphResponse<StreamingOutput>> generator = FluxConverter.builder()
                .startingNode("generate_reply_stream")
                .startingState(state)
                .mapResult(response -> {
                    String aiReply = response.getResult().getOutput().getText().trim();
                    logger.info("AI 生成的回复：{}", aiReply);
                    
                    // 计算置信度（简单示例）
                    double confidence = calculateConfidence(category, sentiment);
                    
                    return Map.of(
                        "ai_reply", aiReply,
                        "ai_confidence", confidence
                    );
                })
                .build(chatResponseFlux);

        return Map.of("reply_generator", generator);
    }

    /**
     * 计算 AI 回复的置信度
     */
    private double calculateConfidence(String category, String sentiment) {
        double confidence = 0.8; // 基础置信度
        
        // 根据情绪调整
        if ("negative".equals(sentiment)) {
            confidence -= 0.2; // 负面情绪，降低置信度，建议人工审核
        } else if ("positive".equals(sentiment)) {
            confidence += 0.1;
        }
        
        // 根据类别调整
        if ("投诉建议".equals(category)) {
            confidence -= 0.3; // 投诉需要人工处理
        }
        
        return Math.max(0.1, Math.min(1.0, confidence));
    }
}

